package 常见算法.双指针;

/**
 * @Date 2024/6/26 22:07
 * @description: 盛最多的水
 * .        https://leetcode.cn/problems/container-with-most-water/description/
 * @Author LittleNight
 */
public class likou11 {


    // 双指针， 利用单调性 (掌握这个就可以了)
    public int maxArea(int[] height) {
        int n = height.length;
        int left = 0, right = n - 1, ret = 0;
        while(left < right) {
            int val = Math.min(height[left], height[right]);
            ret = Math.max(ret, (right - left) * val);
            if(height[left] > height[right]) {
                // 更新值小的。
                right--;
            } else {
                left++;
            }
        }
        return ret;
    }


    public int maxArea1(int[] height) {
        int n = height.length;
        int left = 0, right = n - 1, ret = 0;
        while(left < right) {
            int val = Math.min(height[left], height[right]);
            if(height[left] > height[right]) {
                // 先更新结果
                ret = Math.max(ret, (right - left) * val);
                // 抛弃掉右边， 往左移动。 一直往左移动移动到大于 right的值， 注意范围
                // 这部分算是个小优化
                while(right > 0 && height[right] <= val) {
                    right--;
                }
            } else {
                ret = Math.max(ret, (right - left) * val);
                while(left < n - 1 && height[left] <= val) {
                    left++;
                }
            }
        }
        return ret;
    }


}
